package com.example.service;

import com.example.entity.Review;

import java.util.List;
import java.util.Map;

/**
 * 评价服务接口
 * @author System
 * @date 2024
 */
public interface ReviewService {
    
    /**
     * 添加评价
     * @param review 评价信息
     * @return 添加结果
     */
    boolean addReview(Review review);
    
    /**
     * 根据ID查询评价
     * @param id 评价ID
     * @return 评价信息
     */
    Review getReviewById(Long id);
    
    /**
     * 查询所有评价
     * @return 评价列表
     */
    List<Review> getAllReviews();
    
    /**
     * 根据商品ID查询评价
     * @param productId 商品ID
     * @return 评价列表
     */
    List<Review> getReviewsByProductId(Long productId);
    
    /**
     * 根据用户ID查询评价
     * @param userId 用户ID
     * @return 评价列表
     */
    List<Review> getReviewsByUserId(Long userId);
    
    /**
     * 根据商品ID和排序方式查询评价
     * @param productId 商品ID
     * @param sortBy 排序方式（newest, oldest, highest, lowest）
     * @return 评价列表
     */
    List<Review> getReviewsByProductIdWithSort(Long productId, String sortBy);
    
    /**
     * 分页查询评价
     * @param page 页码
     * @param size 每页大小
     * @return 评价列表
     */
    List<Review> getReviewsByPage(int page, int size);
    
    /**
     * 根据商品ID分页查询评价
     * @param productId 商品ID
     * @param page 页码
     * @param size 每页大小
     * @return 评价列表
     */
    List<Review> getReviewsByProductIdWithPage(Long productId, int page, int size);
    
    /**
     * 根据评分查询评价
     * @param rating 评分
     * @return 评价列表
     */
    List<Review> getReviewsByRating(Integer rating);
    
    /**
     * 统计评价总数
     * @return 评价总数
     */
    int getReviewCount();
    
    /**
     * 根据商品ID统计评价数
     * @param productId 商品ID
     * @return 评价数量
     */
    int getReviewCountByProductId(Long productId);
    
    /**
     * 根据用户ID统计评价数
     * @param userId 用户ID
     * @return 评价数量
     */
    int getReviewCountByUserId(Long userId);
    
    /**
     * 计算商品平均评分
     * @param productId 商品ID
     * @return 平均评分
     */
    Double getAverageRatingByProductId(Long productId);
    
    /**
     * 获取商品评分统计
     * @param productId 商品ID
     * @return 评分统计（星级 -> 数量）
     */
    Map<Integer, Integer> getRatingStatsByProductId(Long productId);
    
    /**
     * 更新评价
     * @param review 评价信息
     * @return 更新结果
     */
    boolean updateReview(Review review);
    
    /**
     * 更新评价状态
     * @param id 评价ID
     * @param status 状态
     * @return 更新结果
     */
    boolean updateReviewStatus(Long id, Integer status);
    
    /**
     * 删除评价
     * @param id 评价ID
     * @return 删除结果
     */
    boolean deleteReview(Long id);
    
    /**
     * 批量删除评价
     * @param ids 评价ID列表
     * @return 删除结果
     */
    boolean deleteReviews(List<Long> ids);
    
    /**
     * 审核评价
     * @param id 评价ID
     * @param status 审核状态（1-通过，2-拒绝）
     * @return 审核结果
     */
    boolean auditReview(Long id, Integer status);
    
    /**
     * 获取待审核评价列表
     * @return 待审核评价列表
     */
    List<Review> getPendingReviews();
    
    /**
     * 检查用户是否已评价该商品
     * @param userId 用户ID
     * @param productId 商品ID
     * @return 是否已评价
     */
    boolean hasUserReviewedProduct(Long userId, Long productId);
}